package com.lianboke.link.ad.utils;

import java.sql.Timestamp;
    import java.text.ParseException;  
    import java.text.ParsePosition;  
    import java.text.SimpleDateFormat;  
    import java.util.Calendar;  
    import java.util.Date;  
    import java.util.GregorianCalendar;  
      
    public class TimestampTool {  
      
        /**  
         * 将毫秒转成时间  
         */  
        public static String getTimeMillisToDate(long l) {  
            Timestamp d = new Timestamp(l);  
            return d.toString().substring(0, 19);  
        }  
      
        /**  
         * 当前时间  
         *   
         * @return Timestamp  
         */  
        public static Timestamp crunttime() {  
            return new Timestamp(System.currentTimeMillis());  
        }  
      
        /**  
         * 获取当前时间的字符串  
         *   
         * @return String ex:2006-07-07  
         */  
        public static String getCurrentDate() {  
            Timestamp d = crunttime();  
            return d.toString().substring(0, 10);  
        }  
      
        /**  
         * 获取当前时间的字符串  
         *   
         * @return String ex:2006-07-07 22:10:10  
         */  
        public static String getCurrentDateTime() {  
            Timestamp d = crunttime();  
            return d.toString().substring(0, 19);  
        }  
      
        public static String getWeekDay() {  
            Calendar date = Calendar.getInstance();  
            date.setTime(crunttime());  
            return new SimpleDateFormat("EEEE").format(date.getTime());  
        }  
      
        /**  
         * 获取指定时间的字符串,只到日期  
         *   
         * @param t  
         *            Timestamp  
         * @return String ex:2006-07-07  
         */  
        public static String getStrDate(Timestamp t) {  
            return t.toString().substring(0, 10);  
        }  
      
        /**  
         * 获取指定时间的字符串  
         *   
         * @param t  
         *            Timestamp  
         * @return String ex:2006-07-07 22:10:10  
         */  
        public static String getStrDateTime(Timestamp t) {  
            return t.toString().substring(0, 19);  
        }  
      
        /**  
         * 获得当前日期的前段日期  
         *   
         * @param days  
         * @return String  
         */  
        public static String getStrIntervalDate(String days) {  
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
            Calendar cal = Calendar.getInstance();  
            cal.add(Calendar.DATE, -Integer.parseInt(days));  
            String strBeforeDays = sdf.format(cal.getTime());  
            return strBeforeDays;  
        }  
      
        /**  
         * 格式化时间  
         *   
         * @param dt  
         *            String -> yyyy-MM-dd hh:mm:ss  
         * @return java.util.Date.Date -> yyyy-MM-dd hh:mm:ss  
         */  
        public static Date parseDateTime(String dt) {  
            Date jDt = new Date();  
            try {  
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                if (dt.length() > 10) {  
                    jDt = sdf.parse(dt);  
                }  
            } catch (Exception ex) {  
                ex.printStackTrace();  
            }  
            return jDt;  
        }  
      
        /**  
         * 格式化时间yyyy-MM-dd HH:mm:ss  
         *   
         * @param date  
         *            java.util.Date  
         * @return String -> yyyy-MM-dd HH:mm:ss  
         */  
        public static String parseDateTime(Date date) {  
            String s = null;  
            if (date != null) {  
                try {  
                    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                    s = f.format(date);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
            return s;  
        }  
      
        /**  
         * 格式化日期  
         *   
         * @param dt  
         *            String -> yyyy-MM-dd  
         * @return java.util.Date.Date -> yyyy-MM-dd  
         */  
        public static Date parseDate(String dt) {  
            Date jDt = new Date();  
            try {  
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
                if (dt.length() >= 8) {  
                    jDt = sdf.parse(dt);  
                }  
            } catch (Exception ex) {  
                ex.printStackTrace();  
            }  
            return jDt;  
        }  
      
        /**  
         * 格式化时间yyyy-MM-dd  
         *   
         * @param date  
         *            java.util.Date  
         * @return String -> yyyy-MM-dd  
         */  
        public static String parseDate(Date date) {  
            String s = null;  
            try {  
                if (date != null) {  
                    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");  
                    s = f.format(date);  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return s;  
        }  
      
        /**  
         *   
         * @param dt  
         * @return String  
         */  
        public static String getLongDateFromShortDate(String dt) {  
            String strDT = dt;  
            try {  
                if (strDT != null && strDT.length() <= 10) {  
                    strDT = dt.trim() + " 00:00:00";  
                }  
            } catch (Exception ex) {  
                ex.printStackTrace();  
            }  
            return strDT;  
        }  
      
        /**  
         *   
         * @param dt  
         * @return String  
         */  
        public static String getShortDateToHHMM(String dt) {  
            String jDt = dt;  
            try {  
                if (jDt != null && jDt.length() <= 10) {  
                    jDt = jDt + " 00:00";  
                }  
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");  
                jDt = sdf.parse(jDt).toLocaleString();  
            } catch (Exception ex) {  
                ex.printStackTrace();  
            }  
            return jDt;  
        }  
      
        /**  
         *   
         * @param dateStr  
         * @return String  
         */  
        public static String formatDateToHHMM(String dateStr) {  
            String resultDate = null;  
            try {  
                if (dateStr.length() > 10) {  
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:ss");  
                    Date date = sdf.parse(dateStr);  
                    resultDate = sdf.format(date);  
                } else  
                    resultDate = dateStr;  
            } catch (ParseException e) {  
                e.printStackTrace();  
            }  
            return resultDate;  
        }  
      
        /**  
         * 返回日期 格式:2006-07-05  
         *   
         * @param str  
         * @return Timestamp  
         */  
        public static Timestamp date(String str) {  
            Timestamp tp = null;  
            if (str.length() <= 10) {  
                String[] string = str.trim().split("-");  
                int one = Integer.parseInt(string[0]) - 1900;  
                int two = Integer.parseInt(string[1]) - 1;  
                int three = Integer.parseInt(string[2]);  
                tp = new Timestamp(one, two, three, 0, 0, 0, 0);  
            }  
            return tp;  
        }  
      
        // 获取指定日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16  
        public static String getNextDay(String strDate, int day) {  
            if (strDate != null && !strDate.equals("")) {  
                Calendar cal1 = Calendar.getInstance();  
                String[] string = strDate.trim().split("-");  
                int one = Integer.parseInt(string[0]) - 1900;  
                int two = Integer.parseInt(string[1]) - 1;  
                int three = Integer.parseInt(string[2]);  
                cal1.setTime(new Date(one, two, three));  
                cal1.add(Calendar.DAY_OF_MONTH, day);  
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
                return formatter.format(cal1.getTime());  
            } else {  
                return null;  
            }  
        }  
      
        // 获取指定日期之后的日期字符串 如 2007-02-28 后一年 就是 2008-02-29 （含闰年）  
        public static String getNextYear(String strDate, int year) {  
            Calendar cal1 = Calendar.getInstance();  
            String[] string = strDate.trim().split("-");  
            int one = Integer.parseInt(string[0]) - 1900;  
            int two = Integer.parseInt(string[1]) - 1;  
            int three = Integer.parseInt(string[2]);  
            cal1.setTime(new Date(one, two, three));  
            cal1.add(Calendar.YEAR, year);  
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
            return formatter.format(cal1.getTime());  
        }  
      
        /**  
         * 返回时间和日期 格式:2006-07-05 22:10:10  
         *   
         * @param str  
         * @return Timestamp  
         */  
        public static Timestamp datetime(String str) {  
            Timestamp tp = null;  
            if (str != null && str.length() > 10) {  
                String[] string = str.trim().split(" ");  
                String[] date = string[0].split("-");  
                String[] time = string[1].split(":");  
                int date1 = Integer.parseInt(date[0]) - 1900;  
                int date2 = Integer.parseInt(date[1]) - 1;  
                int date3 = Integer.parseInt(date[2]);  
                int time1 = Integer.parseInt(time[0]);  
                int time2 = Integer.parseInt(time[1]);  
                int time3 = Integer.parseInt(time[2]);  
                tp = new Timestamp(date1, date2, date3, time1, time2, time3, 0);  
            }  
            return tp;  
        }  
      
        /**  
         * 返回日期和时间(没有秒) 格式:2006-07-05 22:10  
         *   
         * @param str  
         * @return Timestamp  
         */  
        public static Timestamp datetimeHm(String str) {  
            Timestamp tp = null;  
            if (str.length() > 10) {  
                String[] string = str.trim().split(" ");  
                String[] date = string[0].split("-");  
                String[] time = string[1].split(":");  
                int date1 = Integer.parseInt(date[0]) - 1900;  
                int date2 = Integer.parseInt(date[1]) - 1;  
                int date3 = Integer.parseInt(date[2]);  
                int time1 = Integer.parseInt(time[0]);  
                int time2 = Integer.parseInt(time[1]);  
                tp = new Timestamp(date1, date2, date3, time1, time2, 0, 0);  
            }  
            return tp;  
        }  
      
        /**  
         * 获得当前系统日期与本周一相差的天数  
         *   
         * @return int  
         */  
        private static int getMondayPlus() {  
            Calendar calendar = Calendar.getInstance();  
            // 获得今天是一周的第几天，正常顺序是星期日是第一天，星期一是第二天......  
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 星期日是第一天  
            return (dayOfWeek == 1) ? -6 : 2 - dayOfWeek;  
        }  
      
        /**  
         * 获得距当前时间所在某星期的周一的日期 例： 0-本周周一日期 -1-上周周一日期 1-下周周一日期  
         *   
         * @param week  
         *            int  
         * @return java.util.Date  
         */  
        public static Date getMondayOfWeek(int week) {  
            int mondayPlus = getMondayPlus(); // 相距周一的天数差  
            GregorianCalendar current = new GregorianCalendar();  
            current.add(GregorianCalendar.DATE, mondayPlus + 7 * week);  
            return current.getTime();  
        }  
      
        /**  
         * 获得某日前后的某一天  
         *   
         * @param date  
         *            java.util.Date  
         * @param day  
         *            int  
         * @return java.util.Date  
         */  
        public static Date getDay(Date date, int day) {  
            GregorianCalendar c = new GregorianCalendar();  
            c.setTime(date);  
            c.add(GregorianCalendar.DATE, day);  
            return c.getTime();  
        }  
      
        /**  
         * 获得距当前周的前后某一周的日期  
         *   
         * @param week  
         *            int  
         * @return String[]  
         */  
        public static String[] getDaysOfWeek(int week) {  
            String[] days = new String[7];  
            Date monday = getMondayOfWeek(week); // 获得距本周前或后的某周周一  
            Timestamp t = new Timestamp(monday.getTime());  
            days[0] = getStrDate(t);  
            for (int i = 1; i < 7; i++) {  
                t = new Timestamp(getDay(monday, i).getTime());  
                days[i] = getStrDate(t);  
            }  
            return days;  
        }  
      
        /***  
         * MCC的UTC时间转换，MCC的UTC不是到毫秒的  
         *   
         * @param utc  
         * @return java.util.Date  
         */  
        public static Date mccUTC2Date(long utc) {  
            Date d = new Date();  
            d.setTime(utc * 1000); // 转成毫秒  
            return d;  
        }  
      
        // 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss  
        public static Date strToDateLong(String strDate) {  
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            ParsePosition pos = new ParsePosition(0);  
            Date strtodate = (Date) formatter.parse(strDate, pos);  
            if (strtodate == null) {  
                formatter = new SimpleDateFormat("yyyy-MM-dd");  
                strtodate = (Date) formatter.parse(strDate, pos);  
            }  
            return strtodate;  
        }  
      
        // 将 yyyy-MM-dd HH:mm 格式字符串转换为时间  
        public static Date strToDateTime(String strDate) {  
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");  
            ParsePosition pos = new ParsePosition(0);  
            Date strtodate = (Date) formatter.parse(strDate, pos);  
            if (strtodate == null) {  
                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                strtodate = (Date) formatter.parse(strDate, pos);  
            }  
            return strtodate;  
        }  
      
        // 根据输入的字符串返回日期字符串 2006-07-07 22:10 2006-07-07  
        public static String getStrDate(String str) {  
            if (str.length() > 10) {  
                String[] string = str.trim().split(" ");  
                return string[0];  
            } else {  
                return getCurrentDate();  
            }  
        }  
      
        // 获取当前时间的字符串 2006-07-07 22:10:10 2006-07-07_221010  
        public static String getStrDateTime() {  
            Timestamp d = crunttime();  
            return d.toString().substring(0, 19).replace(":", "").replace(" ", "_");  
        }  
      
        // 根据日期字符串，返回今天，昨天或日期  
        public static String getDayOrDate(String str) {  
            if (str != null && !str.equals("")) {  
                if (getNextDay(str, 0).equals(getCurrentDate())) {  
                    str = "今天";  
                } else if (getNextDay(str, 1).equals(getCurrentDate())) {  
                    str = "昨天";  
                }  
            }  
            return str;  
        }  
      
        // 返回当前日期所在星期，2对应星期一  
        public static int getMonOfWeek() {  
            Calendar cal1 = Calendar.getInstance();  
            cal1.setTime(new Date());  
            return cal1.get(Calendar.DAY_OF_WEEK);  
        }  
      
        public static void main(String[] args) {  
            System.out.println(System.currentTimeMillis());  
        }  
      
        /**  
         * 获取当前日期之前的日期字符串 如 2007-04-15 前5月 就是 2006-11-15  
         */  
        public static String getPreviousMonth(int month) {  
            Calendar cal1 = Calendar.getInstance();  
            cal1.setTime(new Date());  
            cal1.add(Calendar.MONTH, -month);  
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
            return formatter.format(cal1.getTime());  
      
        }  
      
        public static String getStrYear(int year) {  
            Calendar cal1 = Calendar.getInstance();  
            cal1.setTime(new Date());  
            cal1.add(Calendar.YEAR, -year);  
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy");  
            return formatter.format(cal1.getTime()) + "年份";  
        }  
      
        /**  
         * 比较两个日期前后 可以大于或等于  
         *   
         * @param starDate  
         * @param endDate  
         * @return  
         */  
        public static boolean compareTwoDays(String starDate, String endDate) {  
            Calendar cal_start = Calendar.getInstance();  
            Calendar cal_end = Calendar.getInstance();  
            cal_start.setTime(parseDate(starDate));  
            cal_end.setTime(parseDate(endDate));  
            return cal_end.after(cal_start);  
        }  
      
        public static int getDaysBetween(java.util.Calendar d1,  
                java.util.Calendar d2) {  
            if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end  
                java.util.Calendar swap = d1;  
                d1 = d2;  
                d2 = swap;  
            }  
            int days = d2.get(java.util.Calendar.DAY_OF_YEAR)  
                    - d1.get(java.util.Calendar.DAY_OF_YEAR);  
            int y2 = d2.get(java.util.Calendar.YEAR);  
            if (d1.get(java.util.Calendar.YEAR) != y2) {  
                d1 = (java.util.Calendar) d1.clone();  
                do {  
                    days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);  
                    d1.add(java.util.Calendar.YEAR, 1);  
                } while (d1.get(java.util.Calendar.YEAR) != y2);  
            }  
            return days;  
        }  
      
        // 得到两个日期之间的年  
        public static int dateDiffYear(String starDate, String endDate) {  
            int result = 0;  
            Calendar d1 = Calendar.getInstance();  
            Calendar d2 = Calendar.getInstance();  
            d1.setTime(parseDate(starDate));  
            d2.setTime(parseDate(endDate));  
      
            // 日期大小翻转  
            if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end  
                java.util.Calendar swap = d1;  
                d1 = d2;  
                d2 = swap;  
            }  
            int yy = d2.get(Calendar.YEAR) - d1.get(Calendar.YEAR);  
            int mm = d2.get(Calendar.MONTH) - d1.get(Calendar.MONTH);  
            if (mm < 0) {  
                result = yy - 1;  
            }  
            if (mm > 0) {  
                result = yy;  
            }  
            if (mm == 0) {  
                if ((d2.getTimeInMillis() - d1.getTimeInMillis()) >= 0) {  
                    result = yy;  
                } else {  
                    result = yy - 1;  
                }  
            }  
            return result;  
        }  
      
        // 获取年龄  
        public static int getAgeByBirth(String starDate) {  
            return dateDiffYear(starDate, getCurrentDate());  
        }

        /**
         *  获取当前日期后的指定日期
         * @param values
         * @return
         */
        public static String getCurrentDateNextValues(int values){
            try {
                Calendar calendar = Calendar.getInstance();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                calendar.add(Calendar.DAY_OF_YEAR, values);
                Date date = calendar.getTime();
                return sdf.format(date);
            }catch (Exception e){
                return "";
            }
        }

    }